# InIgnoreCase.java

    package org.codefilarete.stalactite.query.model.operator;

    import java.util.List;
    import java.util.stream.Collectors;

    import org.codefilarete.stalactite.query.model.ConditionalOperator;
    import org.codefilarete.stalactite.query.model.Placeholder;
    import org.codefilarete.stalactite.query.model.ValuedVariable;
    import org.codefilarete.stalactite.query.model.Variable;
    import org.codefilarete.tool.collection.Arrays;
    import org.codefilarete.tool.collection.Iterables;

    /**
     * Represents a "in" with ignore case comparison
     *
     * @author Guillaume Mary
     */
    public class InIgnoreCase extends BiOperandOperator<String, Iterable<String>> {

    	public InIgnoreCase() {
    	}

    	public InIgnoreCase(Iterable<String> value) {
    		super(value);
    	}

    	public InIgnoreCase(String[] value) {
    		this(Arrays.asList(value));
    	}

    	public InIgnoreCase(In<String> other) {
    		super(other.getValue());
    		setNot(other.isNot());
    	}

    	@Override
    	public List<Object> asRawCriterion(Object leftOperand) {
    		Variable<Iterable<String>> value = getValue();
    		if (value instanceof ValuedVariable) {
    			Iterable<String> rawValue = ((ValuedVariable<Iterable<String>>) value).getValue();
    			return Arrays.asList(
    					new LowerCase<>(leftOperand),
    					new In<>(Iterables.stream(rawValue).map(LowerCase::new).collect(Collectors.toList()))
    							.not(isNot())
    			);
    		} else if (value instanceof Placeholder) {
    			return Arrays.asList(
    					new LowerCase<>(leftOperand),
    					new In<>(value)
    							.not(isNot())
    			);
    		} else {
    			throw new UnsupportedOperationException("Unsupported value type: " + (value == null ? null : value.getClass()));
    		}
    	}
    }